package com.example.springboot.service.impl;

import com.example.springboot.Exception.ServiceException;
import com.example.springboot.common.Page;
import com.example.springboot.service.UserService;
import com.example.springboot.utils.MailUtil;
import com.example.springboot.utils.RandomUtil;
import com.example.springboot.utils.TokenUtils;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * 用户表(User)表服务实现类
 *
 * @author makejava
 * @since 2024-01-13 17:16:26
 */
@Service("userService")
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    @Resource
    private MailUtil mailUtil;


    /**
     * 登录
     *
     * @param account
     * @return
     */
    @Override
    public User login(Account account) {
        // 判断当前用户名是否存在
        User userDB = userMapper.selectByUsername(account.getUsername());

        // 如果用户不存在，返回不存在信息
        if (userDB == null) {
            throw new ServiceException("401", "用户不存在！");
        }
        // 判断用户账号密码是否匹配
        if (!userDB.getPassword().equals(account.getPassword())) {
            throw new ServiceException("用户名或密码错误！");
        }
        if (userDB.getStatus() == 0) {
            throw new ServiceException("该商户已被禁用，请联系管理员");
        }
        if (userDB.getStatus() == 2) {
            throw new ServiceException("该商户已被锁定，请联系管理员");
        }
        if (userDB.getStatus() == 3) {
            throw new ServiceException("该商户已被冻结，请联系管理员");
        }

        // 生成token回传前端
        String token = TokenUtils.genToken(userDB.getId().toString(), userDB.getPassword());
        userDB.setToken(token);
        userDB.setLoginTime(new Date());
        // 更新用户信息
        userMapper.update(userDB);
        return userDB;
    }

    /**
     * 注册
     *
     * @param account
     * @return
     */
    @Override
    public User register(Account account) {
        // 首先，判断用户输入的账号是否存在，数据库中用户名是唯一的
        User dbUser = userMapper.selectByUsername(account.getUsername());
        if (dbUser != null) {
            // 用户名已存在，抛出自定义异常
            throw new ServiceException("422", "用户名已存在");
        }
        // 注册==新增用户信息
        try {
            userMapper.insert(account);
            // 返回新增的用户信息
            dbUser = userMapper.selectByUsername(account.getUsername());
            return dbUser;
        } catch (Exception e) {
            throw new ServiceException("注册失败");
        }
    }

    /**
     * 找回密码
     *
     * @param account
     */
    @Override
    @Transactional()
    public void findPassword(Account account) {
        // 首先，判断用户输入的账号是否存在，数据库中用户名是唯一的
        User dbUser = userMapper.selectByUsername(account.getUsername());
        if (dbUser == null) {
            // 用户名不存在，抛出自定义异常
            throw new ServiceException("423", "用户未注册！");
        }
        // 判断用户输入的邮箱和找的邮箱是否一致
        // 如果一样，那么修改，不一样，不修改
        if (!dbUser.getEmail().equals(account.getEmail())) {
            throw new ServiceException("424", "邮箱不一致！");
        }
        // 修改密码
        try {


            // 直接随机生成密码，然后发邮件就行
            int passwordLength = 8;
            String password = RandomUtil.generateRandomPassword(passwordLength);
            System.out.println("生成的随机密码是: " + password);

            account.setPassword(DigestUtils.md5Hex(password));

//            // 发送邮件
            String recipient = account.getEmail();
            Mail mail = new Mail();
            mail.setRecipient(recipient);
            mail.setSubject("并州电子数码商城 \n 密码重置通知 \n");
            mail.setContent("亲爱的用户：您好！\n" +
                    "\n" + "    您收到这封电子邮件是因为您 (也可能是某人冒充您的名义) 申请了修改账号密码。假如这不是您本人所申请, 请不用理会这封电子邮件, 但是如果您持续收到这类的信件骚扰, 请您尽快联络管理员。\n" +
                    "\n" +
                    "   您的密码已重置，新密码为： \n" + "\n  " +
                    password + "\n\n"
            );
            mailUtil.sendSimpleMail(mail);

            userMapper.updatePassword(account);
        } catch (ServiceException e) {
            e.printStackTrace();
            throw new ServiceException("找回密码失败");
        }
    }

    /**
     * 获取所有用户信息
     *
     * @return
     */
    @Override
    public List<User> selectAll() {
        try {
            return userMapper.selectAll();
        } catch (Exception e) {
            throw new ServiceException("查询失败");
        }
    }

    /**
     * 根据ID删除
     *
     * @param id
     */
    @Override
    public void deleteById(Integer id) {
        try {
            userMapper.deleteById(id);
        } catch (Exception e) {
            throw new ServiceException("删除失败");
        }
    }


    /**
     * 根据ID更新信息
     *
     * @param user
     */
    @Override
    public void updateById(User user) {
        try {
            userMapper.updateById(user);
        } catch (Exception e) {
            throw new ServiceException("更新失败");
        }
    }

//    /**
//     * 条件查询
//     * @param username
//     * @param name
//     * @param phone
//     * @param email
//     * @return
//     */
//    @Override
//    public List<User> selectByManyCondition(String username, String name, String phone, String email) {
//        try{
//            return userMapper.selectByManyCondition(username,name,phone,email);
//        }catch (Exception e){
//            throw new ServiceException("查询失败");
//        }
//    }

    /**
     * 条件查询
     *
     * @param username
     * @param name
     * @param phone
     * @param status
     * @return
     */
    @Override
    public List<User> selectByManyCondition(String username, String name, String phone, Integer status) {
        try {
            return userMapper.selectByManyCondition(username, name, phone, status);
        } catch (Exception e) {
            throw new ServiceException("查询失败");
        }
    }

    /**
     * 分页查询
     *
     * @param currentPage
     * @param pageSize
     * @return
     */
    @Override
    public Page<User> selectByPage(Integer currentPage, Integer pageSize) {
        try {
            // 计算起始行
            Integer startRow = (currentPage - 1) * pageSize;


            // 查询总记录数
            int totalCount = userMapper.selectAll().size();
            // 查询分页数据
            List<User> users = userMapper.selectByPage(startRow, pageSize);


            // 封装返回结果
            Page<User> page = new Page<>();
            page.setList(users);
            page.setTotal(totalCount);
            return page;
        } catch (Exception e) {
            throw new ServiceException("查询失败");
        }

    }

//    /**
//     * 条件查询 分页
//     * @param currentPage
//     * @param pageSize
//     * @param username
//     * @param name
//     * @param phone
//     * @param email
//     * @return
//     */
//    @Override
//    public Page<User> selectByManyConditionInpage(Integer currentPage, Integer pageSize, String username, String name, String phone, String email) {
//
//
//        // 计算起始行
//        Integer startRow = (currentPage - 1) * pageSize;
//
//
//
//        // 查询总记录数
//        int totalCount = userMapper.selectByManyCondition(username,name,phone,email).size();
//        // 查询分页数据
//        List<User> users = userMapper.selectByManyConditionInpage(startRow, pageSize,username,name,phone,email);
//
//
//
//        // 封装返回结果
//        Page<User> page = new Page<>();
//        page.setList(users);
//        page.setTotal(totalCount);
//        return page;
//    }

    /**
     * 条件查询 分页
     *
     * @param currentPage
     * @param pageSize
     * @param username
     * @param name
     * @param phone
     * @param status
     * @return
     */
    @Override
    public Page<User> selectByManyConditionInpage(Integer currentPage, Integer pageSize, String username, String name, String phone, Integer status) {
        try {
            // 计算起始行
            Integer startRow = (currentPage - 1) * pageSize;

            // 查询总记录数
            int totalCount = userMapper.selectByManyCondition(username, name, phone, status).size();
            // 查询分页数据
            List<User> users = userMapper.selectByManyConditionInpage(startRow, pageSize, username, name, phone, status);

            // 封装返回结果
            Page<User> page = new Page<>();
            page.setList(users);
            page.setTotal(totalCount);
            return page;
        } catch (Exception e) {
            throw new ServiceException("查询失败");
        }

    }

    /**
     * 条件查询 分页
     *
     * @param currentPage
     * @param pageSize
     * @param username
     * @param name
     * @param phone
     * @return
     */
    @Override
    public Page<User> selectByManyConditionNoStatusInpage(Integer currentPage, Integer pageSize, String username, String name, String phone) {
        try {
            // 计算起始行
            Integer startRow = (currentPage - 1) * pageSize;

            // 查询总记录数
            int totalCount = userMapper.selectByManyConditionNoStatus(username, name, phone).size();
            // 查询分页数据
            List<User> users = userMapper.selectByManyConditionNoStatusInpage(startRow, pageSize, username, name, phone);

            // 封装返回结果
            Page<User> page = new Page<>();
            page.setList(users);
            page.setTotal(totalCount);
            return page;
        } catch (Exception e) {
            throw new ServiceException("查询失败");
        }

    }

    /**
     * 批量删除
     *
     * @param ids
     */
    @Override
    public void deleteByIds(List<Integer> ids) {
        try {
            for (Integer id : ids) {
                userMapper.deleteById(id);
            }
        } catch (Exception e) {
            throw new ServiceException("删除失败");
        }
    }

    /**
     * 添加用户
     *
     * @param user
     */
    @Override
    public void addUser(User user) {
        User userDB = null;
        try {
            // 查询添加的账号是否存在
            userDB = userMapper.selectByUsername(user.getUsername());
        } catch (Exception e) {
            throw new ServiceException("账号查询失败");
        }

        if (userDB == null) {
            try {
                userMapper.addUser(user);
            } catch (Exception e) {
                throw new ServiceException("添加失败");
            }
        } else {
            throw new ServiceException("账号已存在");
        }

    }

    /**
     * 根据id查询用户
     *
     * @param id
     * @return
     */
    @Override
    public User selectById(Integer id) {
        try {
            return userMapper.selectById(id);
        } catch (Exception e) {
            throw new ServiceException("用户不存在");
        }
    }

    /**
     * 加载所有用户
     *
     * @return
     */
    @Override
    public List<User> loadAllUser() {
        try {
            return userMapper.loadAllUser();
        } catch (Exception e) {
            throw new ServiceException("加载用户失败");
        }
    }

    @Override
    public long getTotal() {
        try {
            return userMapper.getTotal();
        } catch (Exception e) {
            throw new ServiceException("查询用户数量失败");
        }
    }

    @Override
    public void updateAddressById(Integer id, String address) {
        try {
            userMapper.updateAddressById(id, address);
        } catch (Exception e) {
            throw new ServiceException("更新地址失败");
        }
    }

    @Override
    public void updateNameAndAddressAndPhoneById(Integer id, String name, String address, String phone) {
        try {
            userMapper.updateNameAndAddressAndPhoneById(id, name, address, phone);
        } catch (Exception e) {
            throw new ServiceException("更新用户信息失败");
        }
    }

    @Override
    public User getUserById(Integer id) {
        try {
            return userMapper.selectById(id);
        } catch (Exception e) {
            throw new ServiceException("查询用户失败");
        }
    }

    @Override
    public void updateSimpleById(User user) {
        try {
            userMapper.updateSimpleById(user);
        } catch (Exception e) {
            throw new ServiceException("更新用户信息失败");
        }
    }

    @Override
    public void changePasswordById(Integer id, String password, String newPassword) {
        // 先查找id是否存在
        User user = userMapper.selectById(id);
        if (user == null) {
            throw new ServiceException("用户不存在");
        }
        // 判断原密码是否一样
        if (!user.getPassword().equals(password)) {
            throw new ServiceException("原密码错误");
        }
        try {
            userMapper.changePasswordById(id, newPassword);
        } catch (Exception e) {
            throw new ServiceException("修改密码失败");
        }
    }
}
